home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Libris Britannia 4
/
science library(b).zip
/
science library(b)
/
PROGRAMM
/
2336B.ZIP
/
SCRDISK4.EXE
/
arc
/
VALIDATE.C
< prev
next >
Wrap
Text File
|
1990-04-11
|
14KB
|
666 lines
/* Turbo ScrEdit Validate Procedures */
void S_Find_Min_and_Max()
{
int C1, C2, s_len;
S_CompMin[0]=0;
S_CompMax[0]=0;
C1 = 0;
C2 = 0;
s_len=strlen(S_CurStr);
S_Min_Max_Loaded = 0;
S_EndofLine = 0;
while (!S_Min_Max_Loaded)
{
S_Sub++;
if (S_Sub<s_len)
{
if (S_CurStr[S_Sub]==94)
{
S_Sub++;
S_CompMax[C2++]=S_CurStr[S_Sub];
}
else
{
if (S_CurStr[S_Sub]==39)
{
if (S_CompMax[0]==0) strcpy(S_CompMax,S_CompMin);
S_Min_Max_Loaded = 1;
}
else
{
if (S_CompMax[0]==0)
{
S_CompMin[C1++]=S_CurStr[S_Sub];
S_CompMin[C1]=0;
}
else
{
S_CompMax[C2++]=S_CurStr[S_Sub];
S_CompMax[C2]=0;
}
}
}
if ((S_CompMin[0]==92)||(S_CompMin[0]==61)) S_Min_Max_Loaded = 1;
}
else
{
S_Min_Max_Loaded=1;
S_EndofLine =1;
}
}
if (S_UpCase)
{
strcpy(S_CompMin,strupr(S_CompMin));
strcpy(S_CompMax,strupr(S_CompMax));
}
}
void S_ReadNextRangeRec()
{
long rec;
S_CurrLine = S_NextLine;
if (S_VRec != S_NextRec)
{
rec = (S_NextRec)*sizeof(*s_indx);
fseek(s_file,rec,0);
fread(s_indx,sizeof(*s_indx),1,s_file);
S_VRec = S_NextRec;
}
S_NextRec = s_indx->D.s_rangerec [S_CurrLine];
S_NextLine = s_indx->D.s_rangeline[S_CurrLine]-1;
movmem(&s_indx->D.s_rangelist[S_CurrLine][1],&S_CurStr,
s_indx->D.s_rangelist[S_CurrLine][0]);
S_CurStr[s_indx->D.s_rangelist[S_CurrLine][0]]=0;
S_Sub = (S_InsideIf) ? 4:1;
S_CompMin[0]=0;
S_CompMax[0]=0;
}
void S_ProcessDate()
{
char
DateMask[40],
TestMonth[3],
TestDay[3],
TestYear[5],
CheckMonth,
CheckDay,
CheckYear;
int
x,y,z,
WorkMonth,
WorkDay,
WorkYear,
WorkNum;
CheckMonth = 0;
CheckDay = 0;
CheckYear = 0;
WorkMonth = 0;
WorkDay = 0;
WorkYear = 0;
S_ErrorMsg[0] = 0;
x = (S_InsideIf) ? 8:5;
z = x;
y = 0;
while (S_CurStr[x]!=0)
{
switch (S_CurStr[x])
{
case 'D':
{
if (!isdigit(S_EditStr[y]))
{
strcpy(S_ErrorMsg,"Day contains a invalid character for <");
strcat(S_ErrorMsg,(char *)&S_CurStr[z]);
strcat(S_ErrorMsg,"> Format");
goto Exit_Point;
}
CheckDay++;
TestDay[CheckDay-1]=S_EditStr[y];
TestDay[CheckDay] =0;
break;
}
case 'M':
{
if (!isdigit(S_EditStr[y]))
{
strcpy(S_ErrorMsg,"Month contains a invalid character for <");
strcat(S_ErrorMsg,(char *)&S_CurStr[z]);
strcat(S_ErrorMsg,"> Format");
goto Exit_Point;
}
CheckMonth++;
TestMonth[CheckMonth-1]=S_EditStr[y];
TestMonth[CheckMonth] =0;
break;
}
case 'Y':
{
if (!isdigit(S_EditStr[y]))
{
strcpy(S_ErrorMsg,"Year contains a invalid character for <");
strcat(S_ErrorMsg,(char *)&S_CurStr[z]);
strcat(S_ErrorMsg,"> Format");
goto Exit_Point;
}
CheckYear++;
TestYear[CheckYear-1]=S_EditStr[y];
TestYear[CheckYear] =0;
break;
}
default :
{
if (S_EditStr[y]!=S_CurStr[x])
{
strcpy(S_ErrorMsg,"Please enter date in <");
strcat(S_ErrorMsg,(char *)&S_CurStr[z]);
strcat(S_ErrorMsg,"> Format");
goto Exit_Point;
}
}
}
y++;
x++;
}
if (S_EditStr[y]!=0)
{
strcpy(S_ErrorMsg,"You have keyed to many charactes for <");
strcat(S_ErrorMsg,(char *)&S_CurStr[z]);
strcat(S_ErrorMsg,"> Format");
goto Exit_Point;
}
WorkDay = (CheckDay >0) ? atoi(TestDay) :0;
WorkMonth = (CheckMonth>0) ? atoi(TestMonth):0;
WorkYear = (CheckYear >0) ? atoi(TestYear) :0;
WorkNum = (WorkYear/4);
WorkNum *= 4;
WorkNum -= WorkYear;
if ((CheckMonth>0)&&((WorkMonth < 1)||(WorkMonth>12)))
{
strcpy(S_ErrorMsg,"You have keyed a invalid Month. Use 1 thru 12 only");
goto Exit_Point;
}
if (CheckDay>0)
{
if ((WorkMonth==4)||(WorkMonth==6)||(WorkMonth==9)||(WorkMonth==11))
{
if (WorkDay>30)
{
strcpy(S_ErrorMsg,"This month can have only 30 days or less");
goto Exit_Point;
}
}
else
{
if ((WorkMonth!=2)&&(WorkDay>31))
{
strcpy(S_ErrorMsg,"This month can have only 31 days or less");
goto Exit_Point;
}
else
{
if (WorkMonth == 2)
{
if (WorkNum==0)
{
if (WorkDay>29)
{
strcpy(S_ErrorMsg,"February can have only 29 days or less");
goto Exit_Point;
}
}
else
{
if (WorkDay>28)
{
strcpy(S_ErrorMsg,"February can have only 28 days or less");
goto Exit_Point;
}
}
}
}
}
}
if ((CheckYear>0)&&(WorkYear<1))
{
strcpy(S_ErrorMsg,"Year must have a value greater than zero.");
goto Exit_Point;
}
Exit_Point:
if (S_ErrorMsg[0]!=0)
{
S_ScreenValid = 0;
S_Validate_Finished = 1;
S_Skip = 1;
}
}
void S_ProcessIn()
{
int x,y,z;
S_GetFieldType(s_field->C.s_type[S_Point]);
S_Decimal = S_FType;
S_Matched = 0;
S_CompMin[0] = 0;
if (!S_Matched)
{
while ((!S_Matched)&&(S_CompMin[0]!=92)&&(S_CompMin[0]!='='))
{
S_Find_Min_and_Max();
if ((S_CompMin[0]!=92)&&(S_CompMin[0]!='=')&&(!S_EndofLine))
{
if (S_Decimal < 8)
{
S_Numeric = atof(S_EditStr);
S_CompMin_Numeric = atof(S_CompMin);
S_CompMax_Numeric = atof(S_CompMax);
if ((S_Numeric>=S_CompMin_Numeric)&&(S_Numeric<=S_CompMax_Numeric))
S_Matched = 1;
}
else
{
if ((strcmp(S_EditStr,S_CompMin)>=0) &&
(strcmp(S_EditStr,S_CompMax)<=0))
S_Matched = 1;
}
}
if ((S_EndofLine) && ((S_CompMin[0]==0) && (S_CompMax[0]==0)))
{
S_ReadNextRangeRec();
while ((S_CurStr[S_Sub]!=39)&&
(S_CurStr[S_Sub]!=92)&&
(S_CurStr[S_Sub++]!='='));
if ((S_CurStr[S_Sub]==92)||(S_CurStr[S_Sub]=='='))
{
S_CompMin[0]=S_CurStr[S_Sub];
S_CompMin[1]=0;
}
}
}
}
if (S_Matched)
{
while ((S_CurStr[S_Sub]!=92)&&(S_CurStr[S_Sub]!='='))
{
S_Sub=0;
while ((S_CurStr[S_Sub]!=0)&&
(S_CurStr[S_Sub]!=92)&&
(S_CurStr[S_Sub]!='=')) S_Sub++;
if ((S_CurStr[S_Sub]!=92)&&(S_CurStr[S_Sub]!='='))
{
S_ReadNextRangeRec();
S_Sub=0;
}
}
if (S_CurStr[S_Sub]=='=')
{
S_ScreenValid = 0;
S_Validate_Finished = 1;
x = strlen(S_CurStr);
s_copy(S_CurStr,S_ErrorMsg,S_Sub+1,x-S_Sub);
}
else
{
S_OpCode[0]=0;
S_Matched = 0;
}
}
else
{
if (S_CurStr[S_Sub]==92)
{
S_ScreenValid = 0;
S_Validate_Finished = 1;
x = strlen(S_CurStr);
s_copy(S_CurStr,S_ErrorMsg,S_Sub+1,x-S_Sub);
}
else
S_OpCode[0]=0;
}
}
void S_Processif()
{
int c,x,y,z;
S_Matched = 0;
S_CompMin[0]=0;
S_CompMax[0]=0;
S_EndofLine =0;
while (strcmp(S_CompMin,"THEN")!=0)
{
if (S_EndofLine)
{
S_ReadNextRangeRec();
S_Sub=0;
while ((S_CurStr[S_Sub]!=0)&&(S_CurStr[S_Sub]!=39)) S_Sub++;
}
if (S_CurStr[3]=='N')
{
x = 7;
S_OpCode1[0]='N';
}
else
{
x = 3;
S_OpCode1[0]=0;
}
y=0;
while (x>0)
{
if ((S_CurStr[x]!=39)&&(S_CurStr[x]!=32)) S_CompField[y++]=S_CurStr[x++];
else x=0;
S_CompField[y]=0;
}
strupr(S_CompField);
S_FieldNum = 0;
x = 1;
while (x)
{
if (S_FieldNum == s_curr.s_count)
{
S_FieldNum = -1;
x = 0;
}
else
if (strcmp(S_CompField,strupr(s_field->C.s_fieldname[S_FieldNum]))==0)
x=0;
else
S_FieldNum++;
}
S_CompMin[0]=0;
S_CompMax[0]=0;
if (S_FieldNum > -1) S_Get_Field_Value(S_FieldNum);
else strcpy(S_CompMin,"THEN");
if (S_UpCase) strupr(S_EditStr);
S_GetFieldType(s_field->C.s_type[S_FieldNum]);
S_Decimal = S_FType;
S_EndofLine = 0;
while ((strcmp(S_CompMin,"AND")!=0)&&
(strcmp(S_CompMin,"OR")!=0)&&
(strcmp(S_CompMin,"THEN")!=0))
{
if (S_EndofLine)
{
S_ReadNextRangeRec();
S_Sub=0;
while ((S_CurStr[S_Sub]!=0)&&(S_CurStr[S_Sub]!=39)) S_Sub++;
}
S_Find_Min_and_Max();
if ((strcmp(S_CompMin,"AND")!=0)&&
(strcmp(S_CompMin,"OR")!=0) &&
(strcmp(S_CompMin,"THEN")!=0))
{
if (S_Decimal<7)
{
S_Numeric = atof(S_EditStr);
S_CompMin_Numeric = atof(S_CompMin);
S_CompMax_Numeric = atof(S_CompMax);
if (S_OpCode1[0]=='N')
{
if ((S_Numeric<S_CompMin_Numeric)||(S_Numeric>S_CompMax_Numeric))
S_Matched = 1;
}
else
{
if ((S_Numeric>=S_CompMin_Numeric)&&(S_Numeric<=S_CompMax_Numeric))
S_Matched = 1;
}
}
else
{
if (S_OpCode1[0]=='N')
{
if ((strcmp(S_EditStr,S_CompMin)<0)||(strcmp(S_EditStr,S_CompMax)>0))
S_Matched = 1;
}
else
if ((strcmp(S_EditStr,S_CompMin)>=0)&&
(strcmp(S_EditStr,S_CompMax)<=0))
S_Matched = 1;
}
}
}
if (strcmp(S_CompMin,"AND")==0)
{
if (!S_Matched)
{
S_CompMin[0]=0;
while ((strcmp(S_CompMin,"OR")!=0)&&(strcmp(S_CompMin,"THEN")!=0))
{
S_ReadNextRangeRec();
S_Sub=0;
while ((S_CurStr[S_Sub]!=0)&&(S_CurStr[S_Sub]!=39)) S_Sub++;
S_CompMin[0]=0;
while ((strcmp(S_CompMin,"AND")!=0)
&&(strcmp(S_CompMin,"OR")!=0)
&&(strcmp(S_CompMin,"THEN")!=0))
S_Find_Min_and_Max();
}
if (strcmp(S_CompMin,"OR")==0) S_CompMin[0]=0;
}
else
{
S_CompMin[0] = 0;
S_Matched = 0;
}
}
else
{
if (strcmp(S_CompMin,"OR")==0)
{
if (S_Matched)
{
while (strcmp(S_CompMin,"THEN")!=0)
{
S_ReadNextRangeRec();
S_Sub=0;
while ((S_CurStr[S_Sub]!=0)&&(S_CurStr[S_Sub]!=39)) S_Sub++;
while ((strcmp(S_CompMin,"AND")!=0)
&&(strcmp(S_CompMin,"OR")!=0)
&&(strcmp(S_CompMin,"THEN")!=0))
S_Find_Min_and_Max();
}
}
else
S_CompMin[0]=0;
}
}
}
strcpy(S_EditStr,S_EditStrHold);
if (S_Matched)
{
S_Matched = 0;
S_InsideIf = 1;
while ((S_ScreenValid)&&(S_CurStr[0]!='E')&&(!S_Skip))
{
S_ReadNextRangeRec();
if (S_CurStr[0]!='E')
{
switch (S_CurStr[3])
{
case 'D' : {S_ProcessDate();break;}
case 'I' :
{
S_Sub=0;
while ((S_CurStr[S_Sub]!=0)&& (S_CurStr[S_Sub]!=39)) S_Sub++;
S_ProcessIn();
break;
}
case 'S' : {S_Skip = 1;break;}
case 'E' :
{
S_ScreenValid = 0;
strcpy(S_ErrorMsg,&S_CurStr[9]);
}
}
}
}
S_InsideIf = 0;
}
while (strcmp(S_CurStr,"ENDIF")!=0) S_ReadNextRangeRec();
}
void S_Validate_Location()
{
int x,y,z;
S_UpCase= 0;
S_InsideIf= 0;
S_Matched= 0;
S_Skip= 0;
S_OpCode[0]= 0;
S_CurrLine= 9999;
while ((S_NextRec)&&(!S_Skip))
{
S_ReadNextRangeRec();
if (S_CurStr[0] == 'I') /* check for IN or if */
{
S_Sub = s_pos(S_CurStr,"'");
if (S_CurStr[1] == 'F') S_Processif();
else S_ProcessIn();
if (S_Validate_Finished) S_NextRec = 0;
}
if (S_CurStr[0] == 'U') /* check for Upshift key word */
{
if (S_CurStr[10] == 'N') /* if ON */
{
S_UpCase = 1;
strupr(S_EditStr);
}
else
{
S_UpCase = 0; /* if Off */
strcpy(S_EditStr,S_NewStr);
}
strcpy(S_EditStrHold,S_EditStr);
}
if ((S_CurStr[0] == 'R')||((S_CurStr[0] == 'S')&&(S_CurStr[1] == 'K')))
{
x = strlen(S_EditStr);
while ((x>0)&&(S_EditStr[x-1]<33))
{
S_EditStr[x-1]=0;
x++;
}
if (S_EditStr[0]==0)
{
if (S_CurStr[0]=='S') S_NextRec = 0;
if (S_CurStr[0]=='R')
{
S_Sub = 0;
while ((S_CurStr[S_Sub]!=0)&&(S_CurStr[S_Sub]!=39)) S_Sub++;
if (S_CurStr[S_Sub]==39)
strcpy(S_ErrorMsg,(char *)&S_CurStr[S_Sub]);
else
strcpy(S_ErrorMsg,"** This field is required **");
S_ScreenValid = 0;
S_NextRec = 0;
}
}
}
if (S_CurStr[0]=='D') S_ProcessDate();
}
}
void S_ValidateScreen()
{
int C;
S_PrevField = S_Point;
if (s_curr.s_rangerecno==0)
{
S_Validate_Finished = 1;
S_ScreenValid = 1;
}
else
{
S_Point = -1;
S_UpCase = 0;
S_Validate_Finished = 0;
if (S_ValidateField > -1) S_Point = S_ValidateField;
}
while (!S_Validate_Finished)
{
if (S_Point < s_curr.s_count)
{
S_NextRec = s_field->C.s_rangenextrec [S_Point];
S_NextLine = s_field->C.s_rangenextline[S_Point]-1;
if (S_NextRec)
{
S_ScreenValid = 1;
S_Get_Field_Value(S_Point);
strcpy(S_EditStrHold,S_EditStr);
strcpy(S_NewStr,S_EditStr);
S_Validate_Location();
if ((!S_ScreenValid)||(S_ValidateField > -1))
{
S_Validate_Finished = 1;
S_Point--;
}
}
S_Point++;
}
else
{
S_Validate_Finished = 1;
}
}
if (S_ScreenValid)
S_Point = S_PrevField;
else
if (S_IsDupe(S_Point)) S_SetDupeFields = 1;
S_ValidateField = -1;
}